/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package crawler;

/**
 * Анализатор забирает страницы из очереди страниц загруженных downloader'ом
 * и обрабатывает их. Созданные в процессе анализа объекты Page будут
 * отправляться главному модулю на хранение.
 * @author Павельев Антон
 */

public class Analyzer implements Runnable{
    
    private Thread thread;
    private volatile boolean stopped;
    private static volatile boolean analyzerRunned=false;
    
    public Analyzer(){
            if (!analyzerRunned) {
                analyzerRunned=true;
                thread = new Thread(this);
                thread.setName("Analyzer-thr");
                stopped = false;
            } else {
                System.err.println("Невозможно создать более одного анализатора одновременно");
            }
    }
    
    @Override
    public void run(){
        System.out.println("Analyzer.run работает в потоке: "+Thread.currentThread().getName());
        while (!stopped) {
            String page = Downloader.getDownloaded();
            //Если очередь пуста, то отправляем поток в ожидание
            if (page==null) {
                try {
                    System.out.println("Очередь на обработку пуста. Поток анализатора ожидает: вызова notify/ попробует опросить очередь через пять секунд");
                    synchronized(Analyzer.class){
                        Analyzer.class.wait(5000);
                    }
                } catch (InterruptedException ex) {
                    System.err.println("Не удалось приостановить поток анализатора");
                }
            //иначе парсим страницу    
            } else {
                System.out.println("Анализатор схавал загруженную страницу");
                //analyze(page);
                Crawler.pages.add(new Page(null)); //типа проанализировали и добавили
            }
        }
        System.out.println("Поток Analyzer ("+Thread.currentThread().getName()+") завершился.");
    }

     /**
     * 
     * @param page код страницы
     */
    public void analyze(String spage){
        Page page = new Page();
        try {
            //String.substring вызывает исключение, если не может найти такую подстроку
            spage = spage.substring(spage.indexOf("<body>"), spage.indexOf("</body>"));
            page.contentLength = spage.length();
        }
        catch (java.lang.StringIndexOutOfBoundsException e){
            //здесь нужно как-то обработать страницу, в которой нет тега <body> или </body>
        }
        Crawler.pages.add(page);
    }
    
    public Thread getThread() {
        return thread;
    }
    
    /*
     * BufferedReader br = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
	String s;
        //пишем регулярку
        String regexp = "href=\"(.*?)\"";
        //компилируем
        Pattern pattern = Pattern.compile(regexp);
        //компилируем еще одну для ссылок не на страницы
        Pattern filterPatt = Pattern.compile(filterHref); 
       	while((s = br.readLine())!=null){
            Matcher matcher = pattern.matcher(s);
            while (matcher.find()) {
                Matcher filterMatch = filterPatt.matcher(matcher.group(1));
                if (!filterMatch.matches())
                    hLinks.add(matcher.group(1));
            }
        }
	br.close();
     */
    
}
